package com.cy.store.service.impl;

import com.cy.store.entity.Cart;
import com.cy.store.entity.Product;
import com.cy.store.mapper.CartMapper;
import com.cy.store.service.BaseService;
import com.cy.store.service.ICartService;
import com.cy.store.service.IProductService;
import com.cy.store.service.ex.*;
import com.cy.store.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * @author Luo Sheng
 * @school YiBin university
 * @create 2022-12-12 15:29
 */
/** 处理商品数据的业务层接口 */
@Service
public class CartServiceImpl extends BaseService implements ICartService {

    @Autowired
    private CartMapper cartMapper;

    @Autowired
    private IProductService productService;

    /**
     * 将商品添加到购物车
     * @param uid 当前登录用户的id
     * @param pid 商品的id
     * @param amount 增加的数量
     * @param username 当前登录的用户名
     */
    @Override
    public void addToCart(Integer uid, Integer pid, Integer amount, String username) {
        // 根据参数pid和uid查询购物车中的数据
        Cart result = cartMapper.findByUidAndPid(uid, pid);

        Cart cart = new Cart();// -- 创建Cart对象

        // 判断查询结果是否为null
        if (isNull(result)){
            // 是：表示该用户并未将该商品添加到购物车
            // -- 封装数据：uid,pid,amount
            cart.setUid(uid);
            cart.setPid(pid);
            cart.setNum(amount);

            // -- 调用productService.findById(pid)查询商品数据，得到商品价格
            Product product = productService.findById(pid);
            Long price = product.getPrice();
            cart.setPrice(price); // -- 封装数据：price

            // -- 封装数据：4个日志
            updateService(cart, username, INSERT_DATA);

            // -- 调用insert(cart)执行将数据插入到数据表中
            Integer rows = cartMapper.insert(cart);

            // 插入失败
            if (!rows.equals(1)) {
                throw new InsertException(INSERT_ERROR_MESSAGE);
            }

            return; // 直接返回
        }

        // 否：表示该用户的购物车中已有该商品
        result.setNum(result.getNum() + amount); // 获取新的商品数量
        updateService(result, username , UPDATE_DATA);

        // 更新购物车的数量
        Integer rows = cartMapper.updateNumByCid(result);
        if (!rows.equals(1)){
            throw new InsertException(INSERT_ERROR_MESSAGE);
        }
    }

    /**
     * 查询某用户的购物车数据
     * @param uid 用户id
     * @return
     */
    @Override
    public List<CartVO> getVOByUid(Integer uid) {
        // 调用持久层接口方法
        return cartMapper.findVOByUid(uid);
    }

    /**
     * 修改购物车内商品数量
     * @param cid 购物车数量的id
     * @param uid 当前登录的用户的id
     * @param username 当前登录的用户名
     * @param update 修改的数目
     * @return
     */
    @Override
    public Integer updateNum(Integer cid, Integer uid, String username, Integer update) {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        Cart result = cartMapper.findByCid(cid);

        // 判断查询结果是否为null
        if (isNull(result)){
            // 是：抛出CartNotFoundException
            throw new CartNotFoundException(CART_NOTFOUND_MESSAGE);
        }

        // 判断查询结果中的uid与参数uid是否不一致
        if (!result.getUid().equals(uid)){
            // 否：抛出AccessDeniedException
            throw new AccessDeniedException(ACCESS_DENIED_MESSAGE);
        }

        // 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
        Integer resultNum = result.getNum() + update;
        if ( resultNum < 0 ){
            throw new NumBreakBoundsException(BREAK_BOUNDS_MESSAGE);
        }

        // 根据查询结果中的原数量增加1得到新的数量num
        result.setNum(resultNum);

        // 更新日志数据
        updateService(result, username, UPDATE_DATA);

        // 更新购物车商品数据
        Integer rows = cartMapper.updateNumByCid(result);
        if (!rows.equals(1)){
            throw new UpdateException(UPDATE_ERROR_MESSAGE);
        }

        // 返回最终的数量
        return resultNum;
    }

    /**
     * 删除购物车
     * @param uid 用户Id
     * @param cids 购物车id
     * @return
     */
    @Override
    public void deleteCart(Integer uid, List<Integer> cids) {
        for (Integer cid : cids) {
            // 调用findByCid(cid)根据参数cid查询购物车数据
            Cart result = cartMapper.findByCid(cid);

            // 判断查询结果是否为null
            if (isNull(result)){
                // 是：抛出CartNotFoundException
                throw new CartNotFoundException(CART_NOTFOUND_MESSAGE);
            }

            // 判断查询结果中的uid与参数uid是否不一致
            if (!result.getUid().equals(uid)){
                // 否：抛出AccessDeniedException
                throw new AccessDeniedException(ACCESS_DENIED_MESSAGE);
            }
        }

        // 调用持久层接口方法
        Integer rows = cartMapper.deleteByCids(cids);
        if (!rows.equals(1)){
            throw new DeleteException(DELETE_ERROR_MESSAGE);
        }




    }

    /**
     * 获取勾选的购物车商品
     * @param uid 当前登录的用户的id
     * @param cids 若干个购物车数据id
     * @return
     */
    @Override
    public List<CartVO> getVOByCids(Integer uid, Integer[] cids) {
        List<CartVO> list = cartMapper.findVOByCids(cids);

        // 迭代遍历
        Iterator<CartVO> iterator = list.iterator();
        while (iterator.hasNext()){
            CartVO cartVo = iterator.next();
            if (!cartVo.getUid().equals(uid)){
                iterator.remove();
            }
        }

        return list;
    }


}
